#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import re
from PyPDF2 import PdfMerger
import tkinter as tk
from tkinter import messagebox

def natural_sort_key(s):
    """
    使用自然排序算法对字符串进行排序的键函数
    自然排序会将'2.pdf'排在'10.pdf'之前，而不是按照字典序
    """
    return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)]

def merge_pdfs(directory=None):
    """
    合并指定目录下的所有PDF文件
    如果未指定目录，则使用脚本所在目录
    """
    # 如果未指定目录，使用脚本所在目录
    if directory is None:
        # 获取脚本所在目录，兼容直接执行和打包后执行的情况
        if getattr(sys, 'frozen', False):
            # 如果是打包后的可执行文件
            directory = os.path.dirname(sys.executable)
        else:
            # 如果是直接运行的脚本
            directory = os.path.dirname(os.path.abspath(__file__))
    
    # 获取目录中的所有PDF文件
    pdf_files = [f for f in os.listdir(directory) if f.lower().endswith('.pdf')]
    
    # 如果没有找到PDF文件
    if not pdf_files:
        return "未找到PDF文件", False
    
    # 按照自然排序对文件进行排序
    pdf_files.sort(key=natural_sort_key)
    
    # 创建输出目录
    output_dir = os.path.join(directory, "output")
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 设置输出文件名
    output_file = os.path.join(output_dir, "合并文件.pdf")
    # 如果文件已存在，使用递增的文件名
    counter = 1
    while os.path.exists(output_file):
        output_file = os.path.join(output_dir, f"合并文件_{counter}.pdf")
        counter += 1
    
    try:
        # 创建 PdfMerger 对象
        merger = PdfMerger()
        
        # 添加所有PDF文件
        for pdf in pdf_files:
            file_path = os.path.join(directory, pdf)
            merger.append(file_path)
        
        # 写入合并后的PDF文件
        merger.write(output_file)
        merger.close()
        
        return f"PDF文件已成功合并为: {os.path.basename(output_file)}", True
    except Exception as e:
        return f"合并PDF时发生错误: {str(e)}", False

def main():
    """
    主函数
    """
    # 创建GUI窗口
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口
    
    message, success = merge_pdfs()
    
    if success:
        messagebox.showinfo("PDF合并成功", message)
    else:
        messagebox.showerror("PDF合并失败", message)
    
    root.destroy()

if __name__ == "__main__":
    main() 